import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;

import java.text.DecimalFormat;

/**
 * 基础测试类
 *
 * @author godfrey
 * @since 2020-10-23
 */
public abstract class BaseTest {

    /**
     * 开始时间
     */
    private static long beginTime;

    /**
     * 结束时间
     */
    private static long endTime;

    /**
     * 开始内存
     */
    private static long beginMemory;

    /**
     * 结束内存
     */
    private static long endMemory;

    @BeforeEach
    void beginTest() {
        //得到程序开始时的系统时间（纳秒级，最终转化毫秒，保留小数点后两位）
        beginTime = System.nanoTime();
        //得到虚拟机运行、程序开始执行时jvm所占用的内存（byte）
        Runtime runtime = Runtime.getRuntime();
        beginMemory = runtime.totalMemory() - runtime.freeMemory();
    }

    @AfterEach
    void endTest() {
        //得到程序执行完毕时的系统时间（毫秒级）
        endTime = System.nanoTime();
        //得到虚拟机运行、所要测试的执行代码执行完毕时jvm所占用的内存（byte）
        Runtime runtime = Runtime.getRuntime();
        endMemory = runtime.totalMemory() - runtime.freeMemory();

        //计算start和end之间的代码执行期间所耗时间(ms)与内存(M)。
        // 1毫秒(ms) = 1000微秒(us) = 1000 000纳秒(ns)
        // 1M = 1*2^20 byte = 1024 * 1024 byte =  右移 20 byte
        //最终保留两位小数
        DecimalFormat format = new DecimalFormat("0.00");
        System.out.println("执行时间为：" + format.format((double) ((endTime - beginTime) / 1000000)) + " ms, 消耗内存：" + format.format((double) ((endMemory - beginMemory) >> 20)) + " M");
    }
}
